<!DOCTYPE html>
<html>
<head><meta charset="utf-8" />
<title>401-类</title>

<script src="/lib/require/index.js"></script>
<script src="/lib/jquery/index.js"></script>

<!-- 改为引入外部样式 -->
<link rel="stylesheet" href="/css/custom.css">

<!-- Loading mathjax macro -->
<!-- Load mathjax -->
    <script src="/lib/mathjax/index.js"></script>
    <!-- MathJax configuration -->
    <script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: {
            inlineMath: [ ['$','$'], ["\\(","\\)"] ],
            displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
            processEscapes: true,
            processEnvironments: true
        },
        // Center justify equations in code and markdown cells. Elsewhere
        // we use CSS to left justify single line equations in code cells.
        displayAlign: 'center',
        "HTML-CSS": {
            styles: {'.MathJax_Display': {"margin": 0}},
            linebreaks: { automatic: true }
        }
    });
    </script>
    <!-- End of mathjax configuration --></head>
<body>
<div class="toc">
<ul>
                        
                        
                        <li class="toc-li-2">
                            <a href="#类">类</a>
                        </li>
                    
                
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#实例">实例</a>
                        </li>
                    
                
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            </ul>
</div>
  <div tabindex="-1" id="notebook" class="border-box-sizing">
    <div class="container" id="notebook-container">

<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="&#31867;">&#31867;<a class="anchor-link" href="#&#31867;">&#182;</a></h2>
<pre><code>class Person:
    def __init__(self, name):   # 定义self和静态属性
        self.name = name

    def get_name(self):         # 参数self用来表明该方法是该实例的动态属性
        return self.name

    def get_age(self, color):
        d = {}
        d[self.name] = color
    return d

</code></pre>
<p>Python中就规定好了，函数的第一个参数，就必须是实例对象本身，并且建议，约定俗成，把其名字写为self，<code>实例</code>相对<code>其他</code>而言就是<code>自身</code></p>
<p><code>self.name = name</code>：建立实例的一个属性，这个属性的名字也是<code>name</code>，这个属性的值等于参数<code>name</code>所传入的值。</p>
<blockquote><p>这里的属性<code>self.name</code>和参数<code>name</code>是纯属巧合，也可以设置成<code>self.xxx = name</code></p>
</blockquote>
<h3 id="&#23454;&#20363;">&#23454;&#20363;<a class="anchor-link" href="#&#23454;&#20363;">&#182;</a></h3><p>类是对象的定义，实例才是真实的物件。比如“人”是一个类，但是“人”终究不是具体的某个活体，只有“张三”、“李四”才是具体的物件，但他们具有“人”所定义的属性和方法。“张三”、“李四”就是“人”的实例。</p>

<pre><code>if __name__ == "__main__":
    girl = Person("canglaoshi")
    print(girl.name)
    name = girl.get_name()
    print(name)
    her_color = girl.color("white")
    print(her_color)

</code></pre>
<p><code>girl = Person('canglaoshi')</code>是利用上面的类创建实例。</p>
<p>创建实例，调用类<code>Person()</code>，首先就执行初始化函数，初始化函数有两个参数<code>self</code>和<code>name</code>，其中<code>self</code>是默认参数，不需要传值；<code>name</code>则需要给它传值，所以用<code>Person('canglaoshi')</code>的样式，就是为初始化函数中的<code>name</code>参数传值了，即<code>name = 'canglaoshi'</code>。</p>
<p><code>girl</code>就是一个实例，它有属性和方法。</p>
<p>先说属性。实例化过程中，首先要执行<code>__init__()</code>，并通过参数<code>name</code>，使得实例属性<code>self.name = 'canglaoshi'</code>。这里先稍微提一下<code>self</code>的作用，它实质上就是实例对象本身，当你用实例调用方法的时候，由解释器将那个实例传递给方法，所以不需要显示地为这个参数传值。那么<code>self.name</code>也顺理成章地是实例的属性了。所以<code>print(girl.name)</code>的结果应该是<code>canglaoshi</code>。</p>
<p>这就是初始化的功能。简而言之，通过初始化函数，确定了这个实例的“基本属性”（实例是什么样子的）。</p>
<p><code>girl.get_name()</code>是通过实例来调用方法，也可以说建立了实例<code>girl</code>，这个实例就具有了<code>get_name()</code>方法。虽然在类里面，该方法的第一个参数是<code>self</code>，跟前面所述原因一样，通过实例调用该方法——实例方法——的时候，不需要显示地为<code>self</code>传递值，所以，在这里就不需要写任何参数。观察类中这个方法的代码可知，它的功能就是返回实例属性<code>self.name</code>的值，所以<code>print name</code>或者<code>print(name)</code>的结果是<code>canglaoshi</code>。</p>
<p><code>girl.color("white")</code>之所以要给参数传值，是因为<code>def color(self, color)</code>中有参数<code>color</code>。另外，这个方法里面也使用了<code>self.name</code>实例属性。最终该方法返回的是一个字典。所以<code>print her_color</code>或者<code>print(her_color)</code>的结果是<code>{'canglaoshi': 'white'}</code>。</p>
<p>刚才以<code>girl = Person("canglaoshi")</code>的方式，建立了一个实例，仿照它，还可以建立更多的实例，比如<code>boy = Person("zhangsan")</code>等等。也就是一个类，可以建立多个实例。所以“类提供默认行为，是实例的工厂”（源自Learning Python），这句话道破了类和实例的关系。所谓工厂，就是可以用同一个模子做出很多具体的产品。类就是那个模子，实例就是具体的产品。</p>
<p>这就是通过类建立实例，并且通过实例来调用其属性和方法的过程。</p>

</div>
</div>
</div>
    </div>
  </div>
</body>

 


</html>
